Вот, слегка модифицировал твой вариант. Лучше, найти какую-нибудь готовую систему, ибо предметы всегда будут перемещаться, да и с полным инвентарем не корректно работает.
а) Создай 2 переменные-массива по типу "боевая единица" (массив - чтобы для каждого игрока, мы ведь за мультиплеер трем, прально?), назови типа MyChampion и MyChampionDummy.
б) подготовь невидимого героя-пустышку с нужной тебе иконкой, убери ману, если у чемпиона ее нет. Убери ему радиус обзора, убери галочки типа "отмечать на мини-карте" - остальные - опционально.
В дальнейшем мы будем синхронизировать пустышку и реального чемпиона, создавая видимость одной боевой единицы.
Итак, наш первый триггер:
в) Отследи первое появление чемпиона, когда это случится - создай для игрока героя-пустышку. Соответственно сделай MyChampion [number of (Owner of trained unit)]= last trained unit, следующей строчкой создай того самого героя-пустышку для (owner of trained unit) и сделай MyChampionDummy = last created unit. Теперь мы прочно связали этих чуваков. Этот же триггер запускает остальные.
г) Отслеживание здоровья. Сделай изначально выключенный цикличный триггер, там, каждые 0.3 секунды. Триггер запускается пунктом в). Каждые 0.3 секунды меняй здоровье героя (чья икона висит, надо чтобы она соответствовала, прально?) в % на здоровье самого чемпиона.
д) пропищи событие, мол, если выбирает игрок своего героя (кликая на иконку) выбирается чемпион
е) убивай героя вместе с чемпионом
ж) отключай триггеры с проверкой и выбором, пока чемпион мертв
з) не забывай обновлять переменную чемпиона с каждым новым чемпионом.
Берем основную модель, возможно, вообще без мяса, только с гусеницами, но с кучей точек крепления. Также берем кучу моделей-аттачметов, представляющих собой эти самые пушки, корпуса и все прочее. При выборе характеристик модели через диалог или интерфейс соответственно создаем на основной модели эффекты-аттачменты, будет собрана техника. Такие штуки, как двигатель и прочие невидные извне элементы будут скорее входить в математическую модель юнита, но это также можно запилить. Название танка - сразу не скажу, есть ли триггер на смену, но на таблице рекордов можно отобразить что угодно.
2.Тоже можно.
Создаем погодный в определенной местности и делаем два триггера для контроля входа-выхода юнитов из нее. На искомых юнитов применяем нужные способности - и все готово.
Здесь чуть сложнее: нужно постоянно проверять тип местности под юнитом, но тоже можно. Проверка на ограждения тоже может бить сделана.
4.Это уже интереснее. Видел раньше подобное в играх. При каждой атаке юнита случайным образом наносим или не наносим доп. урон, эффект горения, кидаем спелл на цель в зависимости от теоретического места попадания атаки.
5.И это можно. Но нужно писать нестандартную систему Альянса. Но через триггеры и JASS все можно...
Продажа техники - лучше через способность, что бы кидать ее на понравившегося юнита, не стоит покупать кота в мешке. Стоимость должна зависеть от технического уровня юнита, его текущего состояния (мертвый танк попадет вам бесплатно, сами чините!), если он был модернизован дополнительно, то это тоже входит в стоимость. Разрешение на продажу делаем аналогично.
Это легко через Custom Value и переменние.
Как ты понял, все что ты предложил создать можно, но на это нужно потрать хороший кусок времени. Остается пожелать тебе удачи над созданием проекта - мне идея уже нравится.
Но ведь сами по себе ошибки не происходят.
Причина подобного это А) - невнимательность либо твоя либо автора В) - программное обеспечение
Что бы в дальнейшем все было окей, просто сначала потести карту полностью что бы знать что и как должно быть, а потом вноси изменения, будь внимательней.
Еще советую связаться с автором и поговорить с ним об этой проблеме, или запросить у него еще 1 исходник да бы сверЯться с ним.
хранится структура TriggerAction
jass не компилируется а интерпретируется
можно ли использовать локалки из первого добавленного блока кода во втором блоке?
локальная переменная это хранилище данных создаваемое при запуске подпрограммы(функции)
вызвал функцию 10 раз создалось 10 локальных переменных по 1 для каждого запуска
так что ответ нет нельзя
Имена бж функций есть в..blizzard.j, чтобы они не конфликтовали с вашими способностями - чекайте софтом код абилок и близард ж файл, на предмет одинаковых имен и правьте, а так еще советую тулы векса или хеави лок - они сжимают имена и небудет проблем с именами функций и переменных в скрипте.
Я бы определял принадлежность центров квадрата некой окружности. Не так интуитивно-однозначно как проверка принадлежности всех точек квадрата окружности, но гораздо удобнее с точки зрения реализации. Далее для каждой строки поочередно прогоняем алгоритм заливки(в случае, если заливка подразумевает заливку текстурой почвы - стоит учитывать что каждый квадрат почвы имеет размеры 32/32 и центры мелких квадратиков имеют смещение в 16.), закрашивая почву в пределах новоопределенных ректов. Поочередно построчно, т.к. возможно у вас возникнет ситуация черное-белое-черное-белое и вторая строка (если весь массив прогонять подряд, а не построчно) начнется с черного квадрата. Не вижу каких-либо вытекающих неудобств при разработке..
Да как хочешь, главное, чтобы тебе и игрокам удобно было. Можно все коэфициенты складывать (то есть броня снижает на 40%, от огня защита 10%, итого урон от огня снижается на 50%), а можно перемножением (в этом случае будет снижение будет 46%).
Результат, сами понимаете, может быть разный.
От перестановки множителей произведение не меняется. Ведь это будет так.
damage * (1 - common armor %) * (1 - fire armor %)
Нет свои коменты можно редактировать хоть с другой планеты только нужно успеть, после написания комментария есть время что бы исправить, если ты конечно написал комментарий дома а потом пошел к другу, пройдет время и нельзя будет исправить.
Прикрутить сюда систему отлова урона (на каждого нового мага, который будет обладать этой способностью нужно добавить событие на отлов урона). При отлове урона использовать хэш-таблицу или массивы. При ударе юнита в id хэндла атакующего записывать в какую-то ячейку (ее номер не имеет значения, главное, чтобы она не совпадала с номерами ячеек различных систем) количество урона, который должен нанестись и запускать таймер, по истечению которого значение данной ячейки зачистится (главное еще сохранять ссылку на таймер в атакующего юнита; если нет таймера, то создать, а если уже есть, то обновить время в третей ячейки (с учетом того, что в первой - урон, во второй таймер)).
Это жесть, что ты сделал) Этот русификатор триггеров уж такую муть содержит, что ты просто какую-то белиберду сотворил. Исправил до рабочего вида, но чтобы совсем красиво было, это не ко мне, а к джассерам. Просто времени мало на всё, а исправление этих триггеров затратило его довольно много.
Определил причину невидимости модели после сохранения в war3me. В Geoset Animation Manager должна стоять Alpha 1, а он почему-то делает 0 или -1.
Поставил в Geoset Animation Manager не глобальные Color и Alpha, а для первых кадров всех 6 анимаций. Стало всё нормально и триггерные костыли не нужны.
Модель красного свечения ауры на юнитах:
Неуязвимость проверяют через даммика с атакой, через приказ, сможет ли атаковать или нет, просто проверка выполнения приказа. Так же пытаются нанести урон и смотрят сколько он отнял здоровья, так можно и определить неуязвимость и вычислить резист юнита к конкретному типу урона.
Создай новый триггер
событие- Боевая единица входит в нужную область (A Units enters MYREGION)
условие - Боевая единица - Мой Герой (Unittype или Unit Comparison /+ Player comparison)
действие - Победа (Игра-Victory)
Предварительно создай область MYREGION
Melissa, Короче я разобрался - все проблемы были из-за переменной Total_Num_Players, она была подбита под живых игроков, а так как я был единственным живым игроком, то давала строку равную 1 (то есть 0+1 я). В общем спасибо, не додумал бы без твоей помощи до своей ошибки(у тебя ведь создаётся по заданому числу количество строк).
В редакторе объектов есть функция «экспорт всех данных», она сохраняет данные о нестандартных объектах в файл w3o. Потом этот файл можно вставить в новую карту с помощью функции «импорт всех данных по объекту» (в контекстном меню). Чтобы обновить все объекты, нужно вызвать эту функцию, не выбрав никакого конкретного объекта (просто правый клик по списку).
Для совмещения данных из разных версий можно воспользоваться этой утилитой (нужны файлы w3o обеих версий).
Про импорт триггеров всё правильно написал ssbbssc.
Самая большая проблема — с импортированными файлами, тут самый верный способ — добавлять недостающие вручную. Впрочем, некоторые товарищи пишут программы на Пайтоне для этого.
Cпособ #1
Самый простой вариант, это найти и скачать WE Unlimited. Редактор хоть и стар как сам варкрафт. но у него есть так называемый Enchacer. Через данный Enchacer можно вытаскивать любые данные и даже манипулировать импорт и путями. Единственный недостаток, что запускается он не на всех ОС из-за требования каких-то dll которые являются интегрированными в XP, но за каким то чудом нет в остальных Windows, так что придется немного потанцевать с бубном, но потом ты сможешь хоть ландшафт из стандартной карты интегрировать.
Способ #2
MPQ архиватором вскрываешь архив карты и находишь данные о ландшафте и обо всем что на нем стоит. Ищешь или создаешь карту с нужным тебе ландшафтом, и затем интегрируешь все уже в свою карту.
Оба способа требуют манипуляций с файлами, зато позволяет эксплуатировать главную карту как бессмертное ядро, которому надо всего лишь менять внешнюю оболочку в лице ландшафта и декора.
Прикреплю торренты для нормального WC3. Также скачай JNPG:R с XGM, обнови pjass.exe и TESH.
Решение твое проблемы:
Ты делаешь кратер в точке X шириной Y и глубиной Z. Чтобы после его убрать, нужно сделать кратер в точке Х шириной Y и глубиной -Z.
Кажется проблему решили, ответ крылся в текстурах, скорее всего в типе сжатия Sequental JPEG при пресохранени с другим типом сжатия (Пересохранил текстуры в тга и обратно в блп) - проблема решилась (По крайней мере сейчас так кажется).
Из чего могу предположить, то при определенных обстоятельства Варик или система неадекватно воспринимает текстуры с этим типом сжатия и выпадает
Знаю такой баг. Вылечтл удалением из карты всего импорта-мусора и переводов путей импорта на источник из кампании.
Т.е. этот баг возникает при очень большом весе впихиваемой в кампанию карты.
Нашёл систему, где звук передаётся в таймер, который истекает через 0 секунд. В результате один и тот же звук может проигрываться несколько раз без всяких проблем. В инетике пишут мол это такой баг движка.
Какой точный вопрос, однако.
Ответ: триггерно, либо в редакторе объектов, если нужно изменить характеристики, не создаваемые/изменяемые триггерно.
Попытаюсь сыграть в экстрасенса, подстрахуюсь логикой:
Если нужно, чтобы изменялась характеристика количественно, т.е, например, увеличивался наносимый урон, то в действии нанесения урона вместо точного значения нужно выставить функию (формулу, зависимость etc.) имеющую аргументом уровень способности.
Если нужно менять характеристику качественно, например, тип наносимого урона, то следует использовать условия, сравнивающие уровень способности с нужным значением и... далее есть несколько вариантов реализации, но наиболее подходящий - просто выполнять все последующие действия триггера внутри оператора, а затем создать несколько раз скопировать его для других условий. Хотя, с точки зрения программирования, это не очень хороший вариант.
Вроде бы можно такое в последних патчах сделать, а в 1.26 и ниже нет. Но если тебе нужен не общий триггер для любых юнитов, которые у тебя есть и будут, а для конкретного героя, то можно просто считать. Например, у паладина учитываешь разницу в атаке, прибавляешь к ней силу, включая бонусы предметов, прибавляешь атаку от предметов, прибавляешь атаку от баффов, если они на нём есть, вычитаешь атаку от дебаффов, если есть, в итоге получишь его значение атаки. Аналогично с бронёй.
Это жесть, что ты сделал) Этот русификатор триггеров уж такую муть содержит, что ты просто какую-то белиберду сотворил. Исправил до рабочего вида, но чтобы совсем красиво было, это не ко мне, а к джассерам. Просто времени мало на всё, а исправление этих триггеров затратило его довольно много.
Вот условие на проверку баффа. Но тут может быть проблема, если у тебя есть станящие способности, которые используют не этот бафф.
Но мой способ, предложенный выше, также должен работать, причём независимо от того, какой станящий бафф наложен.
Создай новый триггер
событие- Боевая единица входит в нужную область (A Units enters MYREGION)
условие - Боевая единица - Мой Герой (Unittype или Unit Comparison /+ Player comparison)
действие - Победа (Игра-Victory)
Предварительно создай область MYREGION
PT153:
Вспомнил про один баг. Есть сделать PauseTimer() на периодический таймер, а потом на этой таймер использовать ResumeTimer(), то таймер повторит свой цикл лишь раз, а потом остановится.
сам не пользуюсь ResumeTimer, но щас проверил, действительно не работает что-то. Видимо, это работает только тогда, когда таймер не до конца дошел.
можно обойтись и без ResumeTimer
понимаю, ты хочешь сделать какое-то ограничение после возвращения урона. Спустя 3 секунды возвратка может снова возвращать урон.
Можно было сделать по-другому.
Еще не понимаю, зачем нам нужен периодический таймер.
можем логическую переменную b завести и таймер t
нанес противник урон = проверяем логическую переменную, если истина, запускаем одноразовый таймер, и ставим ложь в логической переменной = false
if b then
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Human\\ThunderClap\\ThunderClapCaster.?mdl",u,"origin"))
call UnitDamageTarget(udg_u,u,r*5,false, false, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_UNIVERSAL, WEAPON_TYPE_WHOKNOWS)
call BJDebugMsg("Reflected:"+R2S(r*5))
call TimerStart(udg_t,0.5,false,function t3a)
set b = false
endif
когда таймер запустится
function t3a takes nothing returns nothing
call PauseTimer(udg_t)
set b = true
endfunction
думаю все что надо это call ResumeTimer() заменить на call TimerStart()
Есть, последняя версия работает, пришлось конкретно попарится, в теме про мемхак в последних постах ищи, там уже работает сжасс, полечены многие фаталы и прочее.
Пошарив ещё немного, нашёл pjass.exe, поставил его в едитор и начал крашиться по кд.
Ребутнув пк и переоткрыв эдитор, всё магическим образом заработало =\
У модели не выбрано текстурка которая отвечает за ...я забыл как это называется. Аля погребального огня или что-то того. Оказалось трём материалам не дали текстур, я поправил. Сначала проверь работает ли в игре, а потом смело меняй с заменой у себя в папке.
Держи. Там были использованы несколько лишних текстур (я так понимаю из вова).
Один вопрос, тупа интересна - что ты делал? "Чего только не делал, однако всё об стенку горох."
GearOfRage, в данном случае надо тестировать кампанию, а не саму карту. Открываешь через игру доп кампанию и играешь нужную миссию (для этого надо сделать все миссии временно доступными)
не правильно
ты обнулил переменную а потом удалил точку которая в переменной
а так как переменная пустая то ты ничего не удалил
и локалку плохо юзаеш
лучше
local location l=GetUnitLoc(GetTriggerUnit())
так сразу занесёшь в неё позицию юнита который вошёл в область
короче удели хотяб пол часа на это, это , это и вот это
создать.
направить на 128 точек наверх(90)
сделать неперманентным
текст удалится через 3 секунды
текст затухнет до 100% прозрачности через 3 секунды
Вот чёрт. не успел приплюснуть к посту.
zontik2012 нет, не является утечкой. Если бы ты крепил эффект к точке, к примеру в позиции юнита, причем не удалял бы эту точку потом - то это была бы утечка
Дистанцию оставил как была (0). Но Скорость невидимой волны увеличил до 9999. Такое решение сразу же решило проблему.
Решение временное и сегодня же вечером поменяю её на канал.
ПРАВИЛА ЗАПРЕЩАЮТ НЕСКОЛЬКО ВОПРОСОВ ОДНОВРЕМЕННО!!! Это для того сделано, чтобы бот на каждый вопрос мог показать уже решённые варианты, если сформулирован вопрос нормально, конечно. А ещё это позволит другим пользователям с аналогичными вопросами увидеть ответы на твои. 1. Можно в РО отключить урон юниту и триггерами просчитывать, кто находится перед ним в момент атаки, им будет наноситься урон. 1.5. Не понимаю проблемы, с чего это ты переключаешься на муху, атакуя огромного лорда склепа? 2. Способность Каменные доспехи Ночных Эльфов. 3. И да, и нет. Стандартными средствами сможешь убрать карту через перерисовку интерфейса, разработать и добавить новые кнопки в пул из 12, но для расширения пула или инвентаря потребуются хитрые системы, типа мемхака или DGUI, но не пользовался ими, потому не подскажу, как именно там надо действовать. 4. Можно либо отлавливать урон и прибавлять здоровье, либо делать морф в неуронящего юнита. 5. Не знаю, как именно сделано в Blade of Darkness, но есть событие на нажатие кнопок со стрелками, есть действие на переключение камеры. Просто почитай статью о работе с камерой. 6. У камеры в свойствах есть угол обзора, первую камеру ставишь вниз с углом обзора вверх, что можешь увидеть, поставив галочку в свойствах камеры, вторую камеру поднимаешь вверх и наклоняешь вниз, а в триггере ставишь применить первую камеру в течении 0 секунд, ждать 2 секунды, применить вторую камеру в течении 5 секунд, так обзор будет подниматься в положение второй камеры, ждать 5 секунд.
LongbowMan, могу предложить лишь попробовать пересвязать вершины с костью либо создать несколько костей и попривязывать часть вершин к одной, часть к другой, часть к третьей и т. д. Если не поможет, удали сбояющую аниму и создай заново.
Хотя и это может не помочь, ибо модель действительно очень тяжелая.
По названиям функций думаю понятно что они делают, рассмотрим по подробнее MeleeInitVictoryDefea( )
function MeleeInitVictoryDefeat takes nothing returns nothing
local trigger trig
local integer index
local player indexPlayer
// Create a timer window for the "finish soon" timeout period, it has no timer
// because it is driven by real time (outside of the game state to avoid desyncs)
set bj_finishSoonTimerDialog = CreateTimerDialog(null)
// Set a trigger to fire when we receive a "finish soon" game event
set trig = CreateTrigger()
call TriggerRegisterGameEvent(trig, EVENT_GAME_TOURNAMENT_FINISH_SOON)
call TriggerAddAction(trig, function MeleeTriggerTournamentFinishSoon)
// Set a trigger to fire when we receive a "finish now" game event
set trig = CreateTrigger()
call TriggerRegisterGameEvent(trig, EVENT_GAME_TOURNAMENT_FINISH_NOW)
call TriggerAddAction(trig, function MeleeTriggerTournamentFinishNow)
// Set up each player's mortality code.
set index = 0
loop
set indexPlayer = Player(index)
// Make sure this player slot is playing.
if (GetPlayerSlotState(indexPlayer) == PLAYER_SLOT_STATE_PLAYING) then
set bj_meleeDefeated[index] = false
set bj_meleeVictoried[index] = false
// Create a timer and timer window in case the player is crippled.
set bj_playerIsCrippled[index] = false
set bj_playerIsExposed[index] = false
set bj_crippledTimer[index] = CreateTimer()
set bj_crippledTimerWindows[index] = CreateTimerDialog(bj_crippledTimer[index])
call TimerDialogSetTitle(bj_crippledTimerWindows[index], MeleeGetCrippledTimerMessage(indexPlayer))
// Set a trigger to fire whenever a building is cancelled for this player.
set trig = CreateTrigger()
call TriggerRegisterPlayerUnitEvent(trig, indexPlayer, EVENT_PLAYER_UNIT_CONSTRUCT_CANCEL, null)
call TriggerAddAction(trig, function MeleeTriggerActionConstructCancel)
// Set a trigger to fire whenever a unit dies for this player.
set trig = CreateTrigger()
call TriggerRegisterPlayerUnitEvent(trig, indexPlayer, EVENT_PLAYER_UNIT_DEATH, null)
call TriggerAddAction(trig, function MeleeTriggerActionUnitDeath)
// Set a trigger to fire whenever a unit begins construction for this player
set trig = CreateTrigger()
call TriggerRegisterPlayerUnitEvent(trig, indexPlayer, EVENT_PLAYER_UNIT_CONSTRUCT_START, null)
call TriggerAddAction(trig, function MeleeTriggerActionUnitConstructionStart)
// Set a trigger to fire whenever this player defeats-out
set trig = CreateTrigger()
call TriggerRegisterPlayerEvent(trig, indexPlayer, EVENT_PLAYER_DEFEAT)
call TriggerAddAction(trig, function MeleeTriggerActionPlayerDefeated)
// Set a trigger to fire whenever this player leaves
set trig = CreateTrigger()
call TriggerRegisterPlayerEvent(trig, indexPlayer, EVENT_PLAYER_LEAVE)
call TriggerAddAction(trig, function MeleeTriggerActionPlayerLeft)
// Set a trigger to fire whenever this player changes his/her alliances.
set trig = CreateTrigger()
call TriggerRegisterPlayerAllianceChange(trig, indexPlayer, ALLIANCE_PASSIVE)
call TriggerRegisterPlayerStateEvent(trig, indexPlayer, PLAYER_STATE_ALLIED_VICTORY, EQUAL, 1)
call TriggerAddAction(trig, function MeleeTriggerActionAllianceChange)
else
set bj_meleeDefeated[index] = true
set bj_meleeVictoried[index] = false
// Handle leave events for observers
if (IsPlayerObserver(indexPlayer)) then
// Set a trigger to fire whenever this player leaves
set trig = CreateTrigger()
call TriggerRegisterPlayerEvent(trig, indexPlayer, EVENT_PLAYER_LEAVE)
call TriggerAddAction(trig, function MeleeTriggerActionPlayerLeft)
endif
endif
set index = index + 1
exitwhen index == bj_MAX_PLAYERS
endloop
// Test for victory / defeat at startup, in case the user has already won / lost.
// Allow for a short time to pass first, so that the map can finish loading.
call TimerStart(CreateTimer(), 2.0, false, function MeleeTriggerActionAllianceChange)
endfunction
Вроде много, но тут все просто, создается три триггера один следит за тем сколько построил зданий любой играющий игрок, второй следит сколько зданий погибло у любого играющего игрока, ну а третий следит за теми кто ливнул, чтобы их не преребирать, два прочих вспомогательные, следят за отмненой строительства и прочее.
Итого делаем вывод, чтобы узнать проиграл или нет игрок, нам нужно узнать сколько у него живых зданий, меньше 1 игрок проиграл. А реализовать это можно как угодно, триггерами следящими за смертями и прочим или таймером, который будет переодически считать все здания каждого игрока и давать поражение тем игрокам у кого не осталось ни одного здания...
Это жесть, что ты сделал) Этот русификатор триггеров уж такую муть содержит, что ты просто какую-то белиберду сотворил. Исправил до рабочего вида, но чтобы совсем красиво было, это не ко мне, а к джассерам. Просто времени мало на всё, а исправление этих триггеров затратило его довольно много.
» WarCraft 3 / не могу брать предметы
» WarCraft 3 / Memory Hack 2.0
» WarCraft 3 / Сохранения в кэши игры
» WarCraft 3 / MPQ редактор открывает карту только для чтения
» WarCraft 3 / Пропадает урон героя
» WarCraft 3 / Возможно связано с триггерами
» WarCraft 3 / Ауры
» WarCraft 3 / Алгоритм
» Администрация XGM / Редактирование комментария
» WarCraft 3 / Триггерные эффекты
» WarCraft 3 / Вопрос по триггерам
» WarCraft 3 / Лидерборд и Мультиборд
» WarCraft 3 / Ландшафт и триггеры
» WarCraft 3 / Как сделать фильтр снижения яркости отдельному игроку?
» WarCraft 3 / Карта не запускается + проблемы с редактором
» WarCraft 3 / Триггерная способность
» WarCraft 3 / Вопрос по триггерам.
» WarCraft 3 / MemoryHack
» WarCraft 3 / Проблема с импортом моделей
» WarCraft 3 / Не видно кампанию
» WarCraft 3 / Удаление утечек
» WarCraft 3 / Интерфейс Варкрафт
» WarCraft 3 / Как добавить скрин?
» WarCraft 3 / Кампания
» WarCraft 3 / Эффект грозы